# coding=utf-8
import random


class CreateChineseName:
    # 默认生成的长度
    length = 2
    # 姓氏
    _surnames = ('赵', '钱', '孙', '李', '周', '吴', '郑', '王')
    # 性别
    __gender = None
    # 名称
    __names = {
        "man": ['星', '鹏', '思', '明', '景', '逸', '翔', '恬', '锐', '焦', '祺', '祥', '擎', '轩', '志', '勇'],
        "woman": ["容", "韶", '彩', '黛', '芸', '爱', '露', '青', '妮', '姿', '珍', '倩']
    }

    """
    属性和方法前面的下划线的含义
    _   前面加一个下划线是面向对象中的protected的约束类型 意为受保护的，不能再外部调用，子类可以继承,但是python是语法是可以的，是开发者约定一个条件
    __  前面加两个下划线是面向对象中的private的约束类型，意为私有的方法，只能在类的内部使用，子类也不可以继承
    
    python在实例化后，__标识的属性可以赋值，可以打印，但是不会影响内部的参数
    """

    def __init__(self, length=2, gender=1):
        self.length = length if length > 0 or length <= 2 else 2
        self.__gender = gender

    def get_surname(self):
        """
        获取一个姓氏,这里使用的是元组，元组跟列表的区别是元组的值是固定的，长度不能也不能改变
        :return:
        """
        return self._surnames[random.randint(0, len(self._surnames) - 1)]

    def _get_gender(self):
        """
        前面加了_，所以此方法是受保护的，外部是不能调用的
        :return:
        """
        try:
            # 传递了也可能传递的不规范，所以需要加一些判断
            gender = self.__gender
            if gender == 'man' or gender == 1 or gender == 'boy':
                gender = 'man'
            else:
                gender = 'woman'
        except IndexError as e:
            # 随机生成性别
            gender = "man" if random.randint(1, 2) == 1 else "woman"
        return gender

    def run(self, surname: str = ''):
        if not surname:
            surname = self.get_surname()

        # 根据性别取出名字
        gender_names = self.__names[self._get_gender()]
        # 声明一个字符串变量，用于保存名字
        name = ''
        while True:
            # 随机取出一个字
            name += gender_names[random.randint(0, len(gender_names) - 1)]
            # 判断是否达到长度，达到了则break掉  break打断循环，不然就是个死循环
            if len(name) >= self.length:
                break
        surname += name

        return surname


class CreateManName(CreateChineseName):

    def __init__(self, length=2):
        super().__init__(length, 1)


class CreateWomanName(CreateChineseName):

    def __init__(self, length=2):
        super().__init__(length, 2)
